/*
 * Copyright (c) 2008 James Molloy, Jörg Pfähler, Matthew Iselin
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef KERNEL_PROCESSOR_MIPS_COMMON_PHYSICALMEMORYMANAGER_H
#define KERNEL_PROCESSOR_MIPS_COMMON_PHYSICALMEMORYMANAGER_H

#include <processor/PhysicalMemoryManager.h>

/** @addtogroup kernelprocessormipscommon
 * @{ */

/** \warning The implementation of this module has been seriously hacked 
 *  together. It needs changing, currently it doesn't even support freeing
 *  of pages! */

/** The common mips implementation of the PhysicalMemoryManager
 *\brief Implementation of the PhysicalMemoryManager for common mips */
class MipsCommonPhysicalMemoryManager : public PhysicalMemoryManager
{
public:
  /** Get the MipsCommonPhysicalMemoryManager instance
   *\return instance of the MipsCommonPhysicalMemoryManager */
  inline static MipsCommonPhysicalMemoryManager &instance(){return m_Instance;}

  //
  // PhysicalMemoryManager Interface
  //
  virtual physical_uintptr_t allocatePage();
  virtual void freePage(physical_uintptr_t page);
  virtual bool allocateRegion(MemoryRegion &Region,
                              size_t cPages,
                              size_t pageConstraints,
                              size_t Flags,
                              physical_uintptr_t start = -1);

protected:
  /** The constructor */
  MipsCommonPhysicalMemoryManager();
  /** The destructor */
  virtual ~MipsCommonPhysicalMemoryManager();

private:
  /** The copy-constructor
   *\note Not implemented (singleton) */
  MipsCommonPhysicalMemoryManager(const MipsCommonPhysicalMemoryManager &);
  /** The copy-constructor
   *\note Not implemented (singleton) */
  MipsCommonPhysicalMemoryManager &operator = (const MipsCommonPhysicalMemoryManager &);

  uintptr_t m_NextPage;

  /** The MipsCommonPhysicalMemoryManager class instance */
  static MipsCommonPhysicalMemoryManager m_Instance;
};

/** @} */

#endif
